"""AI检测配置文件"""

from typing import Dict, Any
import random
from .medical_knowledge import MedicalKnowledgeBase

class AIDetectionConfig:
    """AI检测配置类"""
    
    # 基础配置
    DEFAULT_TEMPERATURE = 0.7  # 提高温度以增加多样性
    MIN_CONFIDENCE_THRESHOLD = 0.3
    MAX_TOKENS = 1000
    
    # 随机性配置
    ENABLE_PROMPT_RANDOMIZATION = True
    ENABLE_PARAMETER_VARIATION = True
    
    @classmethod
    def get_dynamic_temperature(cls) -> float:
        """获取动态温度值，增加随机性"""
        if cls.ENABLE_PARAMETER_VARIATION:
            # 在0.6-0.8之间随机变化
            return round(random.uniform(0.6, 0.8), 2)
        return cls.DEFAULT_TEMPERATURE
    
    @classmethod
    def get_analysis_prompts(cls) -> list:
        """获取多样化的分析提示词"""
        prompts = [
            "请仔细观察这张图片，分析其中的头发密度、发际线形状、头皮状况等细节特征。",
            "作为脱发检测专家，请详细分析图片中的头发状况，注意发际线、头顶密度等关键指标。",
            "请从专业角度评估图片中的脱发情况，重点关注头发分布模式和密度变化。",
            "基于您的专业经验，请全面分析这张头发照片的各项脱发指标。"
        ]
        
        if cls.ENABLE_PROMPT_RANDOMIZATION:
            return [random.choice(prompts)]
        return [prompts[0]]
    
    @classmethod
    def get_analysis_focus_points(cls) -> list:
        """获取随机的分析重点"""
        all_points = [
            "观察发际线的后退程度和形状",
            "检查头顶部位的头发密度",
            "评估整体头发的粗细和健康状况",
            "注意任何明显的稀疏区域",
            "考虑年龄、性别等因素对脱发模式的影响",
            "分析头发的光泽度和质地",
            "观察头皮的可见程度",
            "评估发际线的对称性"
        ]
        
        if cls.ENABLE_PROMPT_RANDOMIZATION:
            # 随机选择5-7个重点
            num_points = random.randint(5, 7)
            return random.sample(all_points, num_points)
        return all_points[:5]
    
    @classmethod
    def get_request_params(cls, base_params: Dict[str, Any]) -> Dict[str, Any]:
        """获取动态请求参数"""
        params = base_params.copy()
        params["temperature"] = cls.get_dynamic_temperature()
        
        # 添加一些随机性参数
        if cls.ENABLE_PARAMETER_VARIATION:
            params["top_p"] = round(random.uniform(0.8, 0.95), 2)
            
        return params
    
    @classmethod
    def generate_detection_prompt(cls) -> str:
        """生成动态检测prompt，集成专业医学知识"""
        from datetime import datetime
        
        intro_prompts = cls.get_analysis_prompts()
        focus_points = cls.get_analysis_focus_points()
        
        # 获取专业医学知识
        medical_knowledge = MedicalKnowledgeBase.generate_professional_prompt()
        
        # 构建分析要点字符串
        focus_text = "\n".join([f"             {i+1}. {point}" for i, point in enumerate(focus_points)])
        
        prompt = f"""
             你是一位专门研究脱发的医学专家，精通BASP分型法。{intro_prompts[0]}
             
             我将为您提供三张不同角度的头部照片：
             1. 头顶面照片 - 用于观察头顶部脱发情况和发旋区域
             2. 头侧面照片 - 用于观察发际线形状和侧面脱发程度
             3. 头后面照片 - 用于观察后枕部头发密度作为参考
             
             请综合分析这三张照片，首先判断是否都包含头发、头皮、头部等与脱发检测相关的内容。
             
             如果任何一张图片不包含头发、头皮或头部相关内容（如：风景、动物、物品、其他身体部位等），请返回：
             {{
                 "isValid": false,
                 "warning": "请确保三张照片都包含头发或头皮，分别为头顶面、头侧面、头后面角度"
             }}
             
             如果三张图片都包含头发、头皮或头部相关内容，请基于以下专业医学知识进行精确分析：
             
             {medical_knowledge}
             
             分析要点：
{focus_text}
             
             请严格按照BASP分型标准，根据观察到的具体特征返回以下信息：
             1. BASP分型结果（必须是标准分型：L0, M0-M3, C0-C3, U1-U3, V1-V3, F1-F3之一）
             2. 脱发严重程度（正常、轻度、中度、重度、极重度）
             3. 详细描述（包含具体观察到的特征，如发际线形状、密度变化、头皮可见度等）
             4. 个性化护理建议（基于分型严重程度，不推荐药物）
             5. 检测置信度（基于图片清晰度和可见特征的明确程度，0-1之间的数值）
             
             请严格按照以下JSON格式返回结果：
             {{
                 "isValid": true,
                 "baspType": "具体分型（如M1、C2、V2等）",
                 "severity": "严重程度",
                 "description": "基于BASP标准的详细专业描述",
                 "suggestion": "基于医学知识的个性化护理建议",
                 "confidence": 置信度数值
             }}
             
             分析时间戳：{datetime.now().isoformat()}
             """
        
        return prompt
    
    @classmethod
    def generate_api_params(cls, prompt: str, image_urls: list, model: str) -> Dict[str, Any]:
        """生成API请求参数 - 支持多张图片"""
        # 构建内容列表，包含文本和多张图片
        content = [{"type": "text", "text": prompt}]
        
        # 添加所有图片
        for image_url in image_urls:
            content.append({
                "type": "image_url", 
                "image_url": {"url": image_url}
            })
        
        base_params = {
            "model": model,
            "messages": [
                {
                    "role": "user",
                    "content": content
                }
            ],
            "max_tokens": cls.MAX_TOKENS,
            "temperature": cls.get_dynamic_temperature()
        }
        
        # 添加随机性参数
        if cls.ENABLE_PARAMETER_VARIATION:
            base_params["top_p"] = round(random.uniform(0.8, 0.95), 2)
            
        return base_params